/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年10月10日
 * 项目： rainhy-property
 */
package com.rainhy.property.manager.springdata.entity;

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.GenericGenerator;
import org.joda.time.DateTime;
import org.springframework.data.domain.Persistable;

/**
 * 属性 Entity
 * 
 * @author rain
 * @version [版本号, 2016年10月10日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@Entity
@Table(name = "core_property")
public class PropertyEntity implements Persistable<String> {
    private static final long serialVersionUID = 8862154290501394693L;
    
    /** 主键 */
    @Id
    @GeneratedValue(generator = "paymentableGenerator")
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    @Column(length = 32)
    private String id;
    
    /** 创建者 */
    @Column(length = 32, updatable = false)
    private String createdBy;
    
    /** 创建时间 */
    @Temporal(TemporalType.TIMESTAMP)
    @Column(updatable = false)
    private Date createdDate;
    
    /** 最后修改者 */
    @Column(length = 32)
    private String lastModifiedBy;
    
    /** 最后修改时间 */
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
    
    /** 属性数据类型 */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private PropertyDataType propertyDataType;
    
    /** 属性 key */
    @Column(length = 128, updatable = false, nullable = false)
    private String propertyKey;
    
    /** 属性值-精确数字 */
    @Column(precision = 18, scale = 4)
    private BigDecimal propertyOfBigDecimal;
    
    /** 属性值-布尔 */
    private Boolean propertyOfBoolean;
    
    /** 属性值-日期 */
    @Temporal(TemporalType.TIMESTAMP)
    private Date propertyOfDate;
    
    /** 属性值-整型 */
    private Integer propertyOfInteger;
    
    /** 属性值-字符串 */
    @Column(length = 4000)
    private String propertyOfString;
    
    /** 属性类型 */
    @Column(length = 64, updatable = false, nullable = false)
    private String propertyType;
    
    public PropertyEntity() {
        this(null);
    }
    
    /** 创建一个可持久化实体 */
    public PropertyEntity(String id) {
        this.setId(id);
    }
    
    /** 创建者 */
    public String getCreatedBy() {
        return createdBy;
    }
    
    /** 创建时间 */
    public DateTime getCreatedDate() {
        return null == createdDate ? null : new DateTime(createdDate);
    }
    
    /** 主键 */
    @Override
    public String getId() {
        return id;
    }
    
    /** 最后修改者 */
    public String getLastModifiedBy() {
        return lastModifiedBy;
    }
    
    /** 最后修改时间 */
    public DateTime getLastModifiedDate() {
        return null == lastModifiedDate ? null : new DateTime(lastModifiedDate);
    }
    
    /** 属性数据类型 */
    public PropertyDataType getPropertyDataType() {
        return propertyDataType;
    }
    
    /** 属性 key */
    public String getPropertyKey() {
        return propertyKey;
    }
    
    /** 属性值-精确数字 */
    public BigDecimal getPropertyOfBigDecimal() {
        return propertyOfBigDecimal;
    }
    
    /** 属性值-布尔 */
    public Boolean getPropertyOfBoolean() {
        return propertyOfBoolean;
    }
    
    /** 属性值-日期 */
    public Date getPropertyOfDate() {
        return propertyOfDate;
    }
    
    /** 属性值-整型 */
    public Integer getPropertyOfInteger() {
        return propertyOfInteger;
    }
    
    /** 属性值-字符串 */
    public String getPropertyOfString() {
        return propertyOfString;
    }
    
    /** 属性类型 */
    public String getPropertyType() {
        return propertyType;
    }
    
    @Override
    @Transient
    public boolean isNew() {
        return null == getId();
    }
    
    /** 创建者 */
    public void setCreatedBy(final String createdBy) {
        this.createdBy = createdBy;
    }
    
    /** 创建时间 */
    public void setCreatedDate(final DateTime createdDate) {
        this.createdDate = null == createdDate ? null : createdDate.toDate();
    }
    
    /** 最后修改者 */
    public void setLastModifiedBy(final String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }
    
    /** 最后修改时间 */
    public void setLastModifiedDate(final DateTime lastModifiedDate) {
        this.lastModifiedDate = null == lastModifiedDate ? null : lastModifiedDate.toDate();
    }
    
    /** 属性数据类型 */
    public void setPropertyDataType(PropertyDataType propertyDataType) {
        this.propertyDataType = propertyDataType;
    }
    
    /** 属性 key */
    public void setPropertyKey(String propertyKey) {
        this.propertyKey = propertyKey;
    }
    
    /** 属性值-精确数字 */
    public void setPropertyOfBigDecimal(BigDecimal propertyOfBigDecimal) {
        this.propertyOfBigDecimal = propertyOfBigDecimal;
    }
    
    /** 属性值-布尔 */
    public void setPropertyOfBoolean(Boolean propertyOfBoolean) {
        this.propertyOfBoolean = propertyOfBoolean;
    }
    
    /** 属性值-日期 */
    public void setPropertyOfDate(Date propertyOfDate) {
        this.propertyOfDate = propertyOfDate;
    }
    
    /** 属性值-整型 */
    public void setPropertyOfInteger(Integer propertyOfInteger) {
        this.propertyOfInteger = propertyOfInteger;
    }
    
    /** 属性值-字符串 */
    public void setPropertyOfString(String propertyOfString) {
        this.propertyOfString = propertyOfString;
    }
    
    /** 属性类型 */
    public void setPropertyType(String propertyType) {
        this.propertyType = propertyType;
    }
    
    @Override
    public String toString() {
        return String.format("Entity of type %s with id: %s", this.getClass().getName(), getId());
    }
    
    /** 主键 */
    protected void setId(final String id) {
        this.id = id;
    }
}
